// File: jmcomic-core/src/main/java/dev/jukomu/common/base/logger/FileLogger.java
package dev.jukomu.common.base.logger;

import dev.jukomu.common.util.file.FileUtils;

import java.io.IOException;
import java.util.Set;
import java.util.function.Function;

/**
 * 对应Python的LoggerImpl，实现基于文件的Logger。
 * 每个元素存储在文件的一行中。
 */
public class FileLogger extends AbstractSetLogger<String> {

    private final String logFilePath;

    /**
     * 构造函数。
     *
     * @param logFilePath 日志文件路径
     */
    public FileLogger(String logFilePath) {
        this.logFilePath = logFilePath;
    }

    @Override
    public void load() throws IOException {
        clearData(); // 先清空现有数据

        // 检查文件是否存在，如果不存在则创建空文件
        if (FileUtils.fileNotExists(logFilePath)) {
            FileUtils.createFile(logFilePath);
            return;
        }

        // 读取文件内容，按行添加到Set中
        String content = FileUtils.readText(logFilePath);
        for (String line : content.split("\n")) {
            line = line.trim();
            if (!line.isEmpty()) {
                data.add(line);
            }
        }
    }

    @Override
    public Set<String> save(Function<Set<String>, Set<String>> callback) throws IOException {
        if (data == null && callback == null) {
            return null; // 没有数据且没有回调，无需保存
        }

        makeSureLoaded(); // 确保数据已加载

        Set<String> dataToSave = data;
        if (callback != null) {
            dataToSave = callback.apply(data);
        }

        // 写入文件
        StringBuilder sb = new StringBuilder();
        for (String element : dataToSave) {
            sb.append(element).append("\n");
        }
        FileUtils.writeText(logFilePath, sb.toString());
        return dataToSave; // 返回保存的数据Set
    }

    @Override
    public String toString() {
        return logFilePath;
    }
}